/*
 * 1.00 2012/09/19
 *
 * Copyright (c) 2012 Motch_bs
 * All rights reserved.
 *
 * このソフトウェアは，Motch_bsに所有される機密情報である。
 * これらの機密情報を漏洩してはならず，Motch_bs の意図する
 * 認可の元においてこれを使用すべし。
 */
package jp.co.ufp.sevendaystask.logics;

import jp.co.ufp.sevendaystask.Main;
import jp.co.ufp.sevendaystask.constants.C;
import jp.co.ufp.sevendaystask.listners.MainOnClickListener;
import jp.co.ufp.sevendaystask.listners.MainOnLongClickListener;
import jp.co.ufp.sevendaystask.storage.QueryManager;

import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.model.CategorySeries;
import org.achartengine.renderer.DefaultRenderer;
import org.achartengine.renderer.SimpleSeriesRenderer;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.util.Log;

/**
 * 初期化を行う。
 * 
 * <pre>
 * 1.データベースの作成
 * </pre>
 * 
 * @author Motch_bs
 * 
 */
public class Logic010 {

    /** リスナー登録元クラス */
    private Main main;

    /** データベースヘルパー */
    private QueryManager queryManager;

    /** 値保持 */
    private CategorySeries series;

    /** 描画クラス */
    private DefaultRenderer renderer;

    /** グラフVIEW */
    private GraphicalView chartView;

    /** 円グラフのOnClickリスナー */
    private MainOnClickListener mainOnClickListener;

    /** 円グラフのOnLongClickリスナー */
    private MainOnLongClickListener mainOnLongClickListener;

    /**
     * @param pMain
     * @param pQueryManager
     * @param pSeries
     * @param pRenderer
     * @param pChartView
     */
    public Logic010(
	Main pMain, QueryManager pQueryManager) {
	super();
	this.main = pMain;
	this.queryManager = pQueryManager;
    }

    /**
     * 初期化
     */
    public void initializing() {
	// 　初期化
	series = new CategorySeries(null);
	// 初期化
	renderer = new DefaultRenderer();
	// renderer.setApplyBackgroundColor(true);
	// renderer.setBackgroundColor(Color.argb(100, 50, 50, 50));
	renderer.setChartTitleTextSize(20);
	renderer.setLabelsTextSize(10);
	renderer.setLegendTextSize(10);
	renderer.setMargins(C.RENDER_MARGINS);
	renderer.setZoomButtonsVisible(false);
	renderer.setLabelsTextSize(15); // ラベルの文字サイズ
	renderer.setShowLabels(true); // ラベルを表示するか
	renderer.setLabelsColor(Color.BLACK);
	renderer.setLegendTextSize(9); // 凡例の文字サイズ
	renderer.setShowLegend(false); // 凡例を表示するか
	renderer.setStartAngle(0);
    }

    /**
     * 曜日のデータを取得する。
     * 
     * @param pTargetWeekDay
     * @return
     */
    public Cursor find(
	SQLiteDatabase database,
	int pTargetWeekDay) {

	// 列を定義
	String[] columns = new String[] {
	    C.TASKID,
	    C.WEEKDAY,
	    C.TIME_START,
	    C.TIME_END,
	    C.TASK_TITLE,
	    C.TASK_MEMO,
	    C.TASK_COLOR
	};
	// where句
	String selection = C.WEEKDAY + " = ?";
	// where句の値
	String[] selectionArgs = {
	    Integer.valueOf(pTargetWeekDay).toString()
	};
	// データを取得
	Cursor cursor = database.query(
	    C.TABLE,
	    columns,
	    selection,
	    selectionArgs,
	    null,
	    null,
	    "TIME_START," + C.TASKID);
	// カーソルを先頭行へ
	cursor.moveToFirst();
	return cursor;
    }

    /**
     * データベースから今日の曜日のデータを取得する。
     * 
     * @param chartIndexes
     * @return
     */
    public GraphicalView getGraphicalView() {
	int thisWeek = Logic001.getTodayWeekDay();
	main.position_week = thisWeek;
	// データベースをオープンする
	SQLiteDatabase database = queryManager.getWritableDatabase();
	// データを取得
	Cursor cursor = find(database, thisWeek);
	int maxSize = cursor.getCount();
	for (int i = 0; i < maxSize; i++) {
	    int id = cursor.getInt(0);
	    // String weekDay = cursor.getString(1);
	    String sTimeStart = cursor.getString(2);
	    String sTimeEnd = cursor.getString(3);
	    String taskTitle = cursor.getString(4);
	    // String taskMemo = cursor.getString(5);
	    int taskColor = cursor.getInt(6);
	    cursor.moveToNext();
	    int iTimeStart = Logic001.timeToInt(sTimeStart);
	    int iTimeEnd = Logic001.timeToInt(sTimeEnd);
	    int lDelta = iTimeEnd - iTimeStart;
	    // グラフにデータを設定する。
	    series.add(taskTitle, Integer.valueOf(lDelta));
	    // 色をレンダーに設定する
	    SimpleSeriesRenderer r = new SimpleSeriesRenderer();
	    r.setColor(taskColor);
	    renderer.addSeriesRenderer(r);
	    // MainActivityでデータを共有させる
	    String index = Integer.valueOf(i).toString();
	    String value = Integer.valueOf(id).toString();
	    main.chartIndexes.put(index, value);
	}
	cursor.close();
	database.close();
	// 曜日を取得
	String sThisWeek = Logic001.getWeekDayString(main, thisWeek);
	Log.d("Logic010", "This weekday is " + sThisWeek);
	// ********************************************
	chartView = ChartFactory.getPieChartView(main, series, renderer);
	renderer.setClickEnabled(true);
	renderer.setSelectableBuffer(24);
	// チャートの移動
	renderer.setPanEnabled(true);
	// リスナー登録
	mainOnClickListener = new MainOnClickListener(main, chartView);
	mainOnLongClickListener = new MainOnLongClickListener(main, chartView);
	chartView.setOnClickListener(mainOnClickListener);
	chartView.setOnLongClickListener(mainOnLongClickListener);
	return chartView;
    }

}
